<br/><br/><br/>
<?php 
// +----------------------------------------------------------------------+
// |                       	     TpvMarket                                |
// +----------------------------------------------------------------------+
// |                	     www.tpvmarket.com                            |
// +----------------------------------------------------------------------+
// |       	     Copyright (c) 2013 Carlos Mora Molina    			      |
// +----------------------------------------------------------------------+
// | Este programa es software libre. Puede distribuirlo  y/o modificarlo |
// | bajo los términos de la  licencia GNU General Public License  tal  y |
// | como la publica la Fundación de Software Libre, bajo la denominación |
// | GPL, en su versión 2 o posterior (versión inglesa).                  |
// |                                                                      |
// | This program is free software. You can redistribute it and/or modify |
// | it under the terms of the GNU General Public License as published by |
// | the Free Software Foundation; either version 2 or later of the GPL.  |
// +----------------------------------------------------------------------+
// | Autores/Authors:                                                     |
// |          Carlos Mora <ozonosp@gmail.com>                             |
// +----------------------------------------------------------------------+
//
// $Id: Exp $

// ############################################		CONFIGURACIÓN DEL GENERADOR 	############################################
/**
 * Configuración de la bbdd
 */
$config['BBDD']['host'] = 'localhost';
$config['BBDD']['port'] = 3306;
$config['BBDD']['name'] = array('myDb');
$config['BBDD']['userName'] = 'root';
$config['BBDD']['password'] = 'root';
$config['BBDD']['codification'] = 'utf8';

/**
 * Configuración de las rutas
 */
$config['path_templates'] = ''; //Path a las plantillas
$config['path_generated'] = $_SERVER['DOCUMENT_ROOT']."/php/class/DAOgen/"; //Path donde colocar el contenido generado
$config['path_auto_include'] =  $_SERVER['DOCUMENT_ROOT']."/php/class/DAOgen/auto_include/"; //Path de los ficheros de autoinclusión
$config['DAO_template'] = 'mysql_DAO_template.tpl'; //Nombre de la plantilla DAO
$config['object_template'] = 'object_template.tpl'; //Nombre de la plantilla de objeto

/**
 * Otras configuraciones
 */
$config['generate_alerts'] = true; //Indica si las claes pueden generar alertas en el error_log
$config['date_version_info'] = date("d/m/Y H:i:s")." - Creado por DAOGenerator";

// ########################################		FIN DE LA CONFIGURACIÓN DEL GENERADOR 	#########################################


/**
 * Comprobamos que se ha podido establecer la conexión correctamente
 */
if (!$link =  mysqli_connect($config['BBDD']['host'], $config['BBDD']['userName'], $config['BBDD']['password'], '', $config['BBDD']['port']))
{
	echo "<b style='color:red;'>ERROR:ERROR No fue posible conectarse al servidor de base de datos, asegurese que ha configurado los parámetros en generateData.php";
	exit();;
}
if(!is_array($config['BBDD']['name'])) $config['BBDD']['name'] = array($config['BBDD']['name']);

foreach($config['BBDD']['name'] as $dbName){
	/**
	 * Comprobamos que se ha podido seleccionar la base de datos indicada
	 */
	if(!mysqli_select_db($link,$dbName))
	{
		mysqli_close($link);
		echo "<b style='color:red;'>ERROR:ERROR No fue posible seleccionar la base de datos $dbName";
		continue;
	}
	
	//Establecemos la codificación para trabajar con la BBDD
	mysqli_query ($link, "SET NAMES '".$config['BBDD']['codification']."'");
	
	
	/**
	 * Solicitamos las tablas de la BBDD e iteramos para cada una
	 */
	$result = mysqli_query($link,"SHOW TABLES"); //Obtenemos las tablas de la bbdd
	while($tabla = mysqli_fetch_row($result)){ //Para cada tabla
		$tabla = $tabla[0]; //Obtenemos el nombre de la tabla
		generateObject($tabla,$link); //Generamos la plantilla del objeto
		generateDao($tabla,$link); //Generamos la plantilla del manejador
	}
}
/**
 * Por último escribimos la plantilla de Datasource
 */
copy ('mysqlDatasource.tpl',$config['path_generated'].'Datasource.php'); //Copiamos el datasource



	/**
	 * Genera la clase de Objeto
	 * @param string Nombre de la tabla
	 * @param MYSQL $link
	 */
	function generateObject($tabla,$link){
		global $config;
		$object_template = file_get_contents($config['path_templates'].$config['object_template'], true); //Obtenemos la plantilla
		
		$fields_names = ''; //Contendrá los nombres de los campos
		$auto_include = '';
		
		/**
		 * Si hay un fichero de autoinclude lo incluímos
		 */
		if(file_exists($config['path_auto_include'].ucfirst($tabla).".tpl")){
			$auto_include = file_get_contents($config['path_auto_include'].ucfirst($tabla).".tpl", true); //Obtenemos la plantilla de autoinclude
		}
		
		/**
		 * Obtenemos la descripción de las columnas de la tabla
		 */
		$columnas = mysqli_query($link, "DESCRIBE $tabla");
		while($columna = mysqli_fetch_assoc($columnas)){
			$fields_names .= '	protected $'.$columna['Field'].';'.chr(10); //Generamos el array de campos
		}
		
		/**
		 * Hacemos los reemplazos en las plantillas
		 */
		$object_template = str_replace('__AUTO_INCLUDE__', $auto_include, $object_template);
		$object_template = str_replace('__U_TABLE_NAME__', ucfirst($tabla), $object_template);
		$object_template = str_replace('__TABLE_NAME__', $tabla, $object_template);
		$object_template = str_replace('__FIELDS_NAMES__', $fields_names, $object_template);
		$object_template = str_replace('__DATE_VERSION__', $config['date_version_info'], $object_template);
		if(!$config['generate_alerts']) $object_template = str_replace('error_log(', '//error_log(', $object_template);
		
		/**
		 * Ecribimos el fichero de salida y mostramos si ha ido bien
		 */
		$path_out = $config['path_generated'].ucfirst($tabla).'.php';
		if(!file_put_contents($path_out, $object_template)){
			echo "<b style='color:red;'>ERROR:Ocurrió un error al intentar guardar el archivo generado para la clase ".ucfirst($tabla)." en: $path_out</b><br/>";
		}else{
			echo "<span style='color:green;'>Se generó con éxito la clase ".ucfirst($tabla)." en: $path_out</span><br/>";
		}
	}
	
	/**
	 * Genera los archivos DAO para el manejo de las tablas
	 * @param string Nombre de la tabla
	 * @param MYSQL $link
	 */
	function generateDao($tabla,$link){
		global $config;
		$object_template = file_get_contents($config['path_templates'].$config['DAO_template'], true); //Obtenemos la plantilla
	
		$fields_types = ''; //Contendrá los tipos de los campos
		$auto_include = '';
		unset($where_clausule,$arr_index); //Borramos la cláusula where y el array de índices
	
		/**
		 * Si hay un fichero de autoinclude lo incluímos
		 */
		if(file_exists($config['path_auto_include'].ucfirst($tabla)."Dao.tpl")){
			$auto_include = file_get_contents($config['path_auto_include'].ucfirst($tabla)."Dao.tpl", true); //Obtenemos la plantilla de autoinclude
		}
		
		/**
		 * Obtenemos la descripción de las columnas de la tabla
		 */
		$columnas = mysqli_query($link, "DESCRIBE $tabla");
		$arr_index = '';
		while($columna = mysqli_fetch_assoc($columnas)){ //Para cada columna
			if($columna["Key"] != '') $arr_index[$columna['Key']][] = $columna["Field"]; //Vamos generando el array de índices ['tipo'][] = nombre_campo
			$fields_types .= '		$this->columns["'.$columna['Field'].'"]["Type"] = "'.strtolower($columna["Type"]).'";'.chr(10); //Vamos generando el código para crear array de campos y sus tipos
		}
		
		/**
		 * $arr_index contendrá los índices agrupados por tipo
		 * Generamos la sentencia WHERE para los delete y los update con los índices de la tabla
		 */
		if(!empty($arr_index["PRI"])){ //Si hay claves primarias buscaremos por cualquiera de las primarias e ignoramos las múltiples
			foreach($arr_index["PRI"] as $field){
				if(!isset($where_clausule)) $where_clausule = " $field = '\".\$conn->escapeString(\$valueObject->$field).\"'"; //Si no está asignado ecribimos en formato PriKey = 'Object->key'
				else $where_clausule .= " OR $field = '\".\$conn->escapeString(\$valueObject->$field).\"'"; //Si no está asignado ecribimos en formato PriKey = 'Object->key'
			}
		}else if(!empty($arr_index["MUL"])){ //Si no hay claves primarias buscamos por todas las múltiples
			foreach($arr_index["MUL"] as $field){
				if(!isset($where_clausule)) $where_clausule = " $field = '\".\$conn->escapeString(\$valueObject->$field).\"'"; //Si no está asignado ecribimos en formato PriKey = 'Object->key'
				else $where_clausule .= " AND $field = '\".\$conn->escapeString(\$valueObject->$field).\"'"; //Si no está asignado ecribimos en formato PriKey = 'Object->key'
			}
		}else{
			echo "<b style='color:red;'>ERROR: No hay índices para la tabla $tabla)</b><br/>";
		}
		
		/**
		 * Hacemos los reemplazos en las plantillas
		 */
		$object_template = str_replace('__AUTO_INCLUDE__', $auto_include, $object_template);
		$object_template = str_replace('__U_TABLE_NAME__', ucfirst($tabla), $object_template);
		$object_template = str_replace('__TABLE_NAME__', $tabla, $object_template);
		$object_template = str_replace('__DATE_VERSION__', $config['date_version_info'], $object_template);
		$object_template = str_replace('__FIELDS_DATA_TYPES__', $fields_types, $object_template);
		$object_template = str_replace('__WHERE_CLAUSULE__', "WHERE $where_clausule", $object_template);
		if(!$config['generate_alerts']) $object_template = str_replace('error_log(', '//error_log(', $object_template);
		
		/**
		 * Ecribimos el fichero de salida y mostramos si ha ido bien
		 */
		$path_out = $config['path_generated'].ucfirst($tabla).'Dao.php';
		if(!file_put_contents($path_out, $object_template)){
			echo "<b style='color:red;'>ERROR: Ocurrió un error al intentar guardar el archivo generado para la clase ".ucfirst($tabla)."Dao en: $path_out</b><br/>";
		}else{
			echo "<span style='color:green;'>Se generó con éxito la clase ".ucfirst($tabla)."_DAO en: $path_out</span><br/>";
		}
	}

?>